perm filename PRVLST.NEW[SS,SYS] blob sn#430422 filedate 1979-04-05 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	A B C D E T TT TTT R S W X Y Z P DSK LST PRVBIT UFDN LHPRVS NLHPRV RHPRVS NRHPRV WANTPR
C00006 00003	BADNAM GO LHLOOP RHLOOP NOTRH GOTBIT LOOP LSTUSR SIXIN SIXINL SIXINX SIXIN2
C00011 00004	MFDSOR MFDSO1 MFDSO2 MFDSO3 MFDSO4 MFDSO5 LADJ RADJ
C00014 00005	LIST PRIVLP PRIVL1 NOPRV1 PRNBIT PRNLB1 PRNBTR PRNRB1 OCTLH OCTRH OCTOUT OCTOU1 OUTSIX SIXPUT SIXPU1 PUTSTR PUTST1 PUT CPOPJ1 CPOPJ
C00017 00006	NODISK NOMFD NOCORE MFDERR EMMFD NOTUFD NOUFD NORDIN NOENT PUTERR NOWRIN MFDPTR LSTBUF RDINFO INFO PDL
C00019 ENDMK
C⊗;
;A B C D E T TT TTT R S W X Y Z P DSK LST PRVBIT UFDN LHPRVS NLHPRV RHPRVS NRHPRV WANTPR
TITLE PRVLST Make PRIVS.LST, the list of what users have what privileges

IFNDEF FTUSER,<FTUSER←←0>	;Set to -1 to make program that just
				;types out all users with given privilege

A←1
B←2
C←3
D←4
E←5
T←6
TT←7
TTT←10
R←11
S←12
W←13
X←14
Y←15
Z←16
P←17

DSK←←1
LST←←2

;INFO WORDS
PRVBIT←←1

UFDN←←20		;LENGTH OF A UFD ENTRY

DEFINE PRIVS <
;LEFT HALF
  XLPRIV PRI,400000
XLPRIV DAW,200000		;DISK ABSOLUTE WRITE 
XLPRIV PRO,100000		;FILE SYSTEM RENAME PRIV
XLPRIV REA,40000		;FILE SYSTEM READ PRIV
XLPRIV WRT,20000		;FILE SYSTEM WRITE PRIV
;;XLPRIV UDP,10000
XLPRIV AAO,10000		;ACCESS ALIAS AS OWNER
XLPRIV UPG,4000			;SELECT OTHER DPYS WITH UPGIOT
XLPRIV MES,2000			;CAN DO TTYMES ARBITRARILY
  XLPRIV KIL,1000
XLPRIV DEV,400			;CAN USE DET/ATT DEVICE COMMAND
  XLPRIV SEG,200
XLPRIV SSL,100			;CAN SET SERVICE LEVEL RESERVATION TABLE
XLPRIV ACW,40			;CAN DO ABS MODE WRITE USING SETPR2
XLPRIV INF,20			;CAN READ AND WRITE SPECIAL FILE INFO
  XLPRIV TLK,10
XLPRIV XGP,2			;THIS IS THE XGP FONT COMPILER
XLPRIV LUP,1			;LOCAL USER PRIVILEGE

;RIGHT HALF
XRPRIV ATT,400000		;ALLOWS ATTACH TO PHANTOMS
XRPRIV LIV,200000		;DEFEATS AUTOLOGOUT, LOOKED FOR BY SPY
XRPRIV CSP,40			;COMPUTER SCIENCE PERSONNEL FILES GROUP
XRPRIV ACT,20			;ACCOUNTING FILES GROUP
XRPRIV DEC,10			;DEC PROPRIETARY SOFTWARE FILES GROUP
XRPRIV SCY,4			;SECRETARY GROUP
XRPRIV SYS,2			;SYSTEMS PROGRAMMERS GROUP
XRPRIV MAS,1			;[1,YOURSELF] GROUP (MUST BE A RH PRIV FOR DSKSER)
>

DEFINE XLPRIV ! (NAME,BIT) <
NAME!PRV←←BIT
	BIT,,'NAME'
>
DEFINE XRPRIV (NAME,BIT) <>

LHPRVS:	PRIVS
NLHPRV←←.-LHPRVS

DEFINE XLPRIV (NAME,BIT) <>
DEFINE XRPRIV ! (NAME,BIT) <
NAME!PRV←←BIT
	BIT,,'NAME'
>

RHPRVS:	PRIVS
NRHPRV←←.-RHPRVS

;WANTPR←←DAWPRV!REAPRV!ACWPRV!INFPRV	;PRIVILEGES THIS PROGRAM WANTS

EXTERNAL JOBFF,JOBREL
;BADNAM GO LHLOOP RHLOOP NOTRH GOTBIT LOOP LSTUSR SIXIN SIXINL SIXINX SIXIN2

IFN FTUSER,<
BADNAM:	CLRBFI
	OUTSTR [ASCIZ/
Specify three-letter name or octal value only please./]
>;IFN FTUSER
GO:	RESET
	MOVE P,[-100,,PDL-1]
IFN FTUSER,<
	OUTSTR [ASCIZ/
Privilege you wish to know the holders of: /]
	PUSHJ P,SIXIN		;Read sixbit name of privilege
	 JRST BADNAM		;Not name nor octal number
	 JRST GOTBIT		;Actually read an octal number into B
	MOVSI X,-NLHPRV
	JUMPGE X,NOTLH
LHLOOP:	HRLZ B,LHPRVS(X)	;Get name of some priv
	CAME B,A
	AOBJN X,LHLOOP
	HLLZ B,LHPRVS(X)	;Maybe get bit value
	JUMPL X,GOTBIT
NOTLH:	MOVSI X,-NRHPRV
	JUMPGE X,NOTRH
RHLOOP:	HRLZ B,RHPRVS(X)
	CAME B,A
	AOBJN X,RHLOOP
	HLRZ B,RHPRVS(X)	;Get RH value
	JUMPL X,GOTBIT
NOTRH:	OUTSTR [ASCIZ/No such privilege that I know of./]
	EXIT

GOTBIT:	MOVEM B,USRBIT#		;Remember privilege bit to search for
>;IFN FTUSER
REPEAT 0,<	;Anyone can read privileges out of UFD (or even from INFO)
	MOVEI A,0
	GETPRV A,
	TLO A,WANTPR
	SETPRV A,
	TLC A,WANTPR
	TLCE A,WANTPR
	JRST [	OUTSTR [ASCIZ /You are not privileged to run this program.  Please
see a wizard.
/]
		EXIT	]
>;REPEAT 0
	INIT DSK,17
	'DSK   '
	0
	JRST NODISK
	INIT LST,0
IFN FTUSER,<
	'TTY   '
>;IFN FTUSER
IFE FTUSER,<
	'DSK   '
>;IFE FTUSER
	LSTBUF,,
	JRST NODISK
	MOVE A,['PRIVS ']
	MOVSI B,'LST'
	SETZB C,D
	ENTER LST,A
	JRST NOENT
	MOVE A,['  1  1']
	MOVSI B,'UFD'
	MOVEI C,0
	MOVE D,['  1  1']
	LOOKUP DSK,A
	JRST NOMFD
	HRR D,JOBFF
	SUBI D,1
	MOVEM D,MFDPTR
	HLRE C,D
	HRRZ B,JOBFF
	SUB B,C
	HRRZM B,JOBFF
	CORE B,
	JRST NOCORE
	MOVEI E,0
	INPUT DSK,D
	STATZ DSK,740000
	JRST MFDERR
	CLOSE DSK,
	PUSHJ P,MFDSOR		;Compress and/or sort MFD
	MOVE Z,MFDPTR
	ADDI Z,1
LOOP:
;	MOVE A,(Z)
;	MOVSI B,'UFD'
;	MOVEI C,0
;	MOVE D,['  1  1']
;	LOOKUP DSK,A
;	JRST NOUFD
;	MTAPE DSK,RDINFO
;	JRST NORDIN
IFE FTUSER,<
	PUSHJ P,LIST
>;IFE FTUSER
IFN FTUSER,<
	MOVE A,1(Z)		;Get privs
	TDNE A,USRBIT		;Got bit we're searching for
	PUSHJ P,LSTUSR		;Yes, type out PPN
>;IFN FTUSER
	AOBJN Z,.+1
	AOBJN Z,LOOP
	EXIT

IFN FTUSER,<
LSTUSR:	MOVE T,(Z)		;Get PPN
	PUSHJ P,SIXPUT		;Output it
	MOVEI TT,11
	JRST PUT		;Follow with a tab

SIXIN:	MOVE X,[POINT 6,A]
	SETZB A,B		;A WILL RETURN SIXBIT, B RETURNS OCTAL NUMBER
SIXINL:	INCHWL Y
	ANDI Y,177		;IGNORE BUCKY BITS
	CAIN Y,15
	JRST SIXINL		;IGNORE CR
	CAIN Y,12
	JRST SIXINX		;RETURN
	CAIL Y,"0"
	CAILE Y,"7"		;MAYBE THIS IS OCTAL NUMBER AFTER ALL
	JRST SIXIN2		;NOPE
	CAME X,[POINT 6,A]	;BETTER NOT HAVE SEEN NON DIGIT
	POPJ P,			;LOSE
	LSH B,3
	ADDI B,-"0"(Y)		;ADD IN NEW OCTAL DIGIT
	JRST SIXINL

SIXINX:	AOS (P)
	JUMPN B,CPOPJ		;ONE SKIP FOR NUMBER
	AOS (P)
	POPJ P,

SIXIN2:	TRZ Y,40
	TRZE Y,100
	TRO Y,40		;CONVERT ASCII TO SIXBIT
	TLNE X,770000		;END OF SIXBIT WORD?
	IDPB Y,X		;NO, DEPOSIT NEW CHAR
	JUMPN B,CPOPJ		;DIRECT RETURN QUICK IF BOTH NUMBER AND NAME
	JRST SIXINL

>;IFN FTUSER
;MFDSOR MFDSO1 MFDSO2 MFDSO3 MFDSO4 MFDSO5 LADJ RADJ

MFDSOR:	MOVE Z,MFDPTR
	AOJGE Z,EMMFD
	HRRZ X,Z
MFDSO1:	SKIPN A,(Z)
	JRST MFDSO2
	HLRZ B,1(Z)
	CAIE B,'UFD'
	JRST [	PUSHJ P,NOTUFD
		JRST MFDSO2	]
IFE FTUSER,<
	HRRZ B,A		;PRG
	PUSHJ P,LADJ		;LEFT ADJUST IT
	HRLZM B,(X)
	HLRZ B,A		;PRJ
	PUSHJ P,LADJ
	HRRM B,(X)		;STORE PRG,,PRJ (LEFT ADJUSTED)
>;IFE FTUSER
IFN FTUSER,<
	MOVEM A,(X)		;DON'T BOTHER LEFT ADJUSTING FOR THIS VERSION
>;IFN FTUSER
	MOVE B,13+PRVBIT(Z)	;GET PRIVILEGE WORD
	MOVEM B,1(X)		;AND STORE AFTER PRG,,PRJ
	ADDI X,2
MFDSO2:	ADD Z,[UFDN,,UFDN]
	JUMPL Z,MFDSO1
	HRRZ A,X
	CORE A,
	JRST NOCORE
	SUBI X,1
	SUB X,MFDPTR
	MOVN X,X
	HRLM X,MFDPTR
IFE FTUSER,<	;DON'T SORT MFD FOR SINGLE BIT SEARCH
	OUTSTR [ASCIZ/Sorting MFD.../]
	MOVE Z,MFDPTR
	ADDI Z,1
MFDSO3:	MOVE A,(Z)
	MOVE B,1(Z)		;PRIVILEGES
	MOVE X,Z
MFDSO4:	CAMLE A,(X)
	EXCH B,1(X)
	CAMLE A,(X)
	EXCH A,(X)
	AOBJN X,.+1
	AOBJN X,MFDSO4
	MOVEM A,(Z)
	MOVEM B,1(Z)
	AOBJN Z,.+1
	AOBJN Z,MFDSO3
	MOVE Z,MFDPTR
	ADDI Z,1
MFDSO5:	MOVE A,(Z)
	HLRZ B,A
	PUSHJ P,RADJ
	HRRZM B,(Z)
	HRRZ B,A
	PUSHJ P,RADJ
	HRLM B,(Z)
	AOBJN Z,.+1		;SKIP OVER PRIVILEGE WORD IN THIS RADJ PASS
	AOBJN Z,MFDSO5
	OUTSTR [ASCIZ/sort done.
/]
>;IFE FTUSER
	POPJ P,

LADJ:	SKIPE B
	TRNE B,770000
	POPJ P,
	LSH B,6
	JRST LADJ

RADJ:	SKIPE B
	TRNE B,77
	POPJ P,
	LSH B,-6
	JRST RADJ
;LIST PRIVLP PRIVL1 NOPRV1 PRNBIT PRNLB1 PRNBTR PRNRB1 OCTLH OCTRH OCTOUT OCTOU1 OUTSIX SIXPUT SIXPU1 PUTSTR PUTST1 PUT CPOPJ1 CPOPJ

LIST:	MOVE T,(Z)		;USER NAME
	SKIPN 1(Z)		;PRIVILEGES
	POPJ P,			;DON'T LIST UNLESS THERE ARE PRIVS
	PUSHJ P,SIXPUT
	MOVEI TT,11
	PUSHJ P,PUT
	MOVE A,1(Z)		;GET PRIVILEGES
PRIVLP:	JFFO A,PRIVL1
	JRST NOPRV1
PRIVL1:	MOVSI C,400000
	MOVN B,B
	LSH C,(B)		;GENERATE THE BIT
	ANDCAM C,A		;TURN IT OFF IN A
	PUSHJ P,PRNBIT
	MOVEI TT,";"
	SKIPE A
	PUSHJ P,PUT
	JRST PRIVLP

NOPRV1:	MOVEI T,[ASCIZ /
/]
	PUSHJ P,PUTSTR
	POPJ P,

PRNBIT:	HLLZ B,C
	HRLZ C,C
	JUMPE B,PRNBTR		;JUMP IF NOT A LH BIT
	MOVSI C,-NLHPRV
PRNLB1:	TDNN B,LHPRVS(C)
	AOBJN C,PRNLB1
	JUMPGE C,OCTLH
	HRRZ T,LHPRVS(C)
	JRST OUTSIX

PRNBTR:	MOVSI B,-NRHPRV
PRNRB1:	TDNN C,RHPRVS(B)
	AOBJN B,PRNRB1
	JUMPGE B,OCTRH
	HRRZ T,RHPRVS(B)
	JRST OUTSIX

OCTLH:	HLRZ T,B
	PUSHJ P,OCTOUT
	MOVEI T,[ASCIZ /,,0/]
	JRST PUTSTR

OCTRH:	HLRZ T,C
OCTOUT:	IDIVI T,10
	JUMPE T,OCTOU1
	HRLM TT,(P)
	PUSHJ P,OCTOUT
	HLRZ TT,(P)
OCTOU1:	ADDI TT,"0"
	JRST PUT

OUTSIX:	JUMPE T,CPOPJ
	MOVEI TT,0
	ROTC T,6
	JUMPE TT,OUTSIX
	ADDI TT,40
	PUSHJ P,PUT
	JRST OUTSIX

SIXPUT:	JUMPE T,CPOPJ
	MOVEI TTT,6
SIXPU1:	MOVEI TT,0
	ROTC T,6
	ADDI TT,40
	PUSHJ P,PUT
	SOJG TTT,SIXPU1
	POPJ P,

PUTSTR:	HRLI T,440700
PUTST1:	ILDB TT,T
	JUMPE TT,CPOPJ
	PUSHJ P,PUT
	JRST PUTST1

PUT:	SOSG LSTBUF+2
	OUT LST,
	CAIA
	JRST PUTERR
	IDPB TT,LSTBUF+1
	POPJ P,

CPOPJ1:	AOS (P)
CPOPJ:	POPJ P,
;NODISK NOMFD NOCORE MFDERR EMMFD NOTUFD NOUFD NORDIN NOENT PUTERR NOWRIN MFDPTR LSTBUF RDINFO INFO PDL

NODISK:	OUTSTR [ASCIZ /CAN'T INIT THE DISK
/]
	EXIT

NOMFD:	OUTSTR [ASCIZ /CAN'T LOOKUP THE MFD
/]
	EXIT

NOCORE:	OUTSTR [ASCIZ /NOT ENOUGH CORE
/]
	EXIT

MFDERR:	OUTSTR [ASCIZ /ERROR READING MFD
/]
	EXIT

EMMFD:	OUTSTR [ASCIZ /THE MFD IS EMPTY
/]
	EXIT

NOTUFD:	OUTSTR [ASCIZ /EXTENSION IN MFD IS NOT 'UFD'
/]
	POPJ P,

NOUFD:	OUTSTR [ASCIZ /CAN'T LOOKUP A UFD
/]
	EXIT

NORDIN:	OUTSTR [ASCIZ /MTAPE TO READ INFO FAILED
/]
	EXIT

NOENT:	OUTSTR [ASCIZ /CAN'T ENTER PRIVS.LST
/]
	EXIT

PUTERR:	OUTSTR [ASCIZ /ERROR IN OUTPUT TO LIST FILE
/]
	EXIT

NOWRIN:	OUTSTR [ASCIZ /MTAPE TO WRITE INFO FAILED
/]
	EXIT

MFDPTR:	0
LSTBUF:	BLOCK 3
RDINFO:	'GODMOD'
	10
	INFO

INFO:	BLOCK 4

PDL:	BLOCK 100

	END GO